﻿using EntitiesLayer;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;

namespace Bitacora
{
    public static class Logger
    {
         /// <summary>
        /// Determina si el usuario permitio en la configuracion que se escriba el
        /// mensaje en la bitacora
        /// </summary>
        /// <param name="TipoError">Tipo de mensaje que se desea enviar a la bitacora</param>
        /// <returns>Retorna el valor configurado por el usuario para el tipo de mensaje</returns>
        internal static bool RevisarEscritura(Bitacora.TipoError error)
        {
            switch (error)
            {
                case Bitacora.TipoError.Error:
                    {
                        return Configuracion.mensajeError;
                    }
                case Bitacora.TipoError.Log:
                    {
                        return Configuracion.mensajeLog;
                    }
                case Bitacora.TipoError.Informacion:
                    {
                        return Configuracion.mensajeInformacion;
                    }
                default:
                    return false;
            }
        }

        /// <summary>
        /// Escribe el mensaje enviado por la aplicacion en el archivo de bitacora
        /// </summary>
        /// <param name="nombreAplicacion">Nombre de la aplicacion dentro del sistema que envia el mensaje</param>
        /// <param name="mensaje">Mensaje enviado por la aplicacion</param>
        /// <param name="extension">Extecion del archivo de bitacora</param>
        internal static void EscrituraArchivo(string nombreAplicacion, string mensaje, string extension = ".Log")
        {
            int contadorLog = 0;
            string nombreArchivoLog = Configuracion.ubicacionLogs + "\\" + Configuracion.identificacionSistema + "-" + nombreAplicacion + "-" + DateTime.Now.ToString("yyyyMMdd") + extension;

            if (!(Directory.Exists(Configuracion.ubicacionLogs)))
                Directory.CreateDirectory(Configuracion.ubicacionLogs);
            try
            {
                using (StreamWriter swLogLocal = new StreamWriter(nombreArchivoLog, true))
                {
                    swLogLocal.WriteLine(mensaje);
                    swLogLocal.Flush();
                }

                FileInfo propiedArchivo = new FileInfo(nombreArchivoLog);
                if (propiedArchivo.Length > (Configuracion.tamanoMaximoLogsBytes * 1000))
                {
                    while (true)
                        try
                        {
                            File.Move(nombreArchivoLog, nombreArchivoLog + contadorLog.ToString() + ".old");
                            break;
                        }
                        catch { contadorLog++; }
                }
            }

            catch (Exception exc)
            {
                throw new Exception("Imposible escribir en el logFile " + exc.Message);
            }

        }

        /// <summary>
        /// Escribe el mensaje enviado por la aplicacion en el Event Viewer de Windows
        /// </summary>
        /// <param name="msgText">Mensaje enviado por la aplicacion</param>
        /// <param name="_eventSourceName">Aplicacion que origina el evento</param>
        /// <param name="_eventLogName">Nombre del registro que enviara al Event Viewer</param>
        public static void LogEnWindows(string msgText, string _eventSourceName, string _eventLogName)
        {
            try
            {
                EventLog logServicioWindows = new EventLog();
                if (!EventLog.SourceExists(_eventSourceName))
                {
                    EventLog.CreateEventSource(_eventSourceName,_eventLogName);
                }
                logServicioWindows.Log = _eventLogName;
                logServicioWindows.Source = _eventSourceName;
                logServicioWindows.WriteEntry(msgText, EventLogEntryType.Error);
            }
            catch(Exception exc)
            {
                throw (exc);
            }
        }

    }
}
